#include <iostream>
#include "Mutex.hpp"
#include <unistd.h>
#include <string>

int num = 0;

// MpthreayMutex::Mutex mtx;
pthread_mutex_t mtx;

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;


void* tickets(void*args)
{
    std::string name = static_cast<const char*>(args);
    while (true)
    {
        // mtx.Lock();
        pthread_mutex_lock(&mtx);
        if (num > 0)
        {
            // usleep(1000); //没有加保护
            printf("%s get a ticket : %d\n", name.c_str(),num--);
            // mtx.Unlock();
            pthread_mutex_unlock(&mtx);

            // pthread_cond_signal(&cond);
            
            //还要做别的操作，不然一个进程解锁之后立马又去申请锁
            usleep(50); //效率奇高
        }
        else 
        {
            // mtx.Unlock();
            //条件变量，保证线程安全的情况下，让系统变得更加合理和高效
            printf("%s 陷入等待队列\n",name.c_str());
            pthread_cond_wait(&cond,&mtx);
            printf("%s 从等待队列被唤醒\n",name.c_str());
        }
        pthread_mutex_unlock(&mtx);
    }
    return nullptr;
}

int main()
{
    pthread_t tid1;
    pthread_t tid2;
    pthread_t tid3;
    pthread_t tid4;


    pthread_create(&tid1,nullptr,tickets,(void*)"thread-1");
    pthread_create(&tid2,nullptr,tickets,(void*)"thread-2");
    pthread_create(&tid3,nullptr,tickets,(void*)"thread-3");
    pthread_create(&tid4,nullptr,tickets,(void*)"thread-4");

    int cnt = 10;
    while(true)
    {
        sleep(5);
        num += 10;
        // pthread_cond_signal(&cond); //环形等待队列中的第一个线程
        pthread_cond_broadcast(&cond); //环形等待队列中的所有线程
    }

    pthread_join(tid1,nullptr);
    pthread_join(tid2,nullptr);
    pthread_join(tid3,nullptr);
    pthread_join(tid4,nullptr);
    return 0;
}